//
// Created by Jisam on 08/10/2024 20:05.
// Solution of  d
#include <bits/stdc++.h>

#define  int long long
#define  endl "\n"
#define  all(x) (x).begin(),(x).end()
#define  pb push_back
using namespace std;

struct node {
    double a, b, c, d, ti;
};

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    // 定义变量n、s、t，分别代表点的数量、移动速度和传送速度
    double n, s, t;
    // 初始化最短时间为最大双精度值，用于后续比较
    double ans = DBL_MAX;
    // 读取输入的点的数量、移动速度和传送速度
    cin >> n >> s >> t;

    // 初始化一个节点数组a，用于存储每个点的信息
    vector<node> a(n);
    // 初始化一个访问标记数组，用于在深度优先搜索中标记点是否被访问过
    vector<int> vis(n, 0);

    // 定义一个lambda表达式用于计算两点之间的距离
    auto dis = [&](double a, double b, double c, double d) {
        return sqrt((a - c) * (a - c) + (b - d) * (b - d));
    };

    // 读取每个点的坐标和传送时间，并计算每个点的传送时间
    for (int i = 0; i < n; i++) {
        cin >> a[i].a >> a[i].b >> a[i].c >> a[i].d;
        a[i].ti = dis(a[i].a, a[i].b, a[i].c, a[i].d) / t;
    }

    // 定义一个递归的深度优先搜索函数，用于寻找最短时间路径
    auto dfs = [&](auto dfs, int m, double x, double y, double t2) {
        // 如果已经遍历完所有点，更新最短时间
        if (m >= n) {
            ans = min(ans, t2);
            return;
        }
        // 遍历所有未访问的点
        for (int i = 0; i < n; i++) {
            if (vis[i])continue;
            vis[i] = 1;
            // 计算到达下一个点的时间，并递归调用dfs
            double nt = t2 + dis(x, y, a[i].a, a[i].b) / s + a[i].ti;
            dfs(dfs, m + 1, a[i].c, a[i].d, nt);
            // 计算到达另一个位置的时间，并递归调用dfs
            double nt2 = t2 + dis(x, y, a[i].c, a[i].d) / s + a[i].ti;
            dfs(dfs, m + 1, a[i].a, a[i].b, nt2);
            // 回溯，标记该点为未访问
            vis[i] = 0;
        }
        return;
    };

    // 从起点开始进行深度优先搜索
    dfs(dfs, 0, 0.0, 0.0, 0.0);

    // 输出最短时间，保留20位小数
    cout << fixed << setprecision(20) << ans;
    return 0;
}